#include <iostream>

using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
    ListNode *newList = new ListNode(0);
    ListNode *cur = newList;
    bool flag = false; // 判断是否进位。
    while (l1 != nullptr || l2 != nullptr || flag == true)
    {
        // 有可能l1和l2都为空了但是还有进位
        int x = (l1 == nullptr ? 0 : l1->val);
        int y = (l2 == nullptr ? 0 : l2->val);
        int value = x + y;
        if (flag)
        {
            value++;
            flag = false;
        }
        if (value >= 10)
        {
            flag = true;
            value %= 10;
        }

        cur->next = new ListNode(value);
        cur = cur->next;
        if (l1 != nullptr)
        {
            l1 = l1->next;
        }
        if (l2 != nullptr)
        {
            l2 = l2->next;
        }
    }
    return newList->next;
}
